#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

//处理字符串中的6字节乱码汉字 C3 XX C2 XX C2 XX
//Onvif中的中文UTF8名字（搜索到的）会被编码为该格式
//所以需要进行二次转义处理
void resolveHZcode(char *orgstr, char *newstr)
{
    int j=0,i = 0;
    int needDeal = 0; //0, 0x40, 0xff
    int nearestC3 = 0; //为了确保处理C2时是紧接着C3后面的汉字，而非其他C2编码字符（如C2 A0代表无中断空格，不应转换)
    //注意，有时候一些繁体汉字造成乱码问题，可能出现C3 XX C2 XX C2 XX C2 XX，因此本项目暂时仅考虑最多8字节的情况
    for (i=0;i<strlen(orgstr);i++)
    {
        unsigned char c = (unsigned char)orgstr[i];

        if(needDeal == 0x40)    // C3后面的字节，添加0x40
        {
            newstr[j] = c + 0x40;
            j++;

            needDeal = 0;
            continue;
        }
        if(needDeal == 0xff)    // C2后面的字节，直接接续
        {
            newstr[j] = c;
            j++;

            needDeal = 0;
            continue;
        }

        if(c == 0xc3)
        {
            needDeal = 0x40;
            nearestC3 = i+1; //+1是为了防止字符串第一个字节就是C3造成误判
            continue;
        }
        if(c == 0xc2)
        {
            if((nearestC3-1 + 2 == i) || (nearestC3-1 + 4 == i) || (nearestC3-1 + 6 == i)) //为了确保处理C2时是紧接着C3后面的汉字.
            {
                needDeal = 0xff;
                continue;
            }
        }

        if(nearestC3 > 0)
        {
            if(nearestC3-1 + 2 == i) //如果C3 XX 后面没有跟C2，说明汉字不完整，删除先前的1字节内容
            {
                j--;
            }
            if(nearestC3-1 + 4 == i) //如果C3 XX C2 XX 后面没有跟C2，说明汉字不完整，删除先前2字节内容
            {
                j -= 2;
            }
        }
        nearestC3 = 0;

        newstr[j] = c;
        j++;
    }
    newstr[j] = 0;
}

int main(int argc,char *argv[])
{
	char instr[] = {0xC3,0xA5,0xC2,0xBD,0xC2,0xBC,0xC3,0xA5,0xC2,0xB2,0xC2,0xB8,0xC3,0xA8,0xC2,0x8A,0xC2,0xB1};
	char outstr[32];

	resolveHZcode(instr,outstr);
	printf("outstr = %s\n",outstr);
	return 0;
}

